package com.lizicloud.infrastructure.common.utils;

import java.util.regex.Pattern;
import java.util.List;
import java.util.ArrayList;

/**
 * 正则表达式工具类
 */
public class RegexUtils {
    
    /**
     * 手机号正则表达式
     */
    public static final String PHONE_REGEX = "^1[3-9]\\d{9}$";
    
    /**
     * 邮箱正则表达式
     */
    public static final String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
    
    /**
     * 身份证号正则表达式（18位）
     */
    public static final String ID_CARD_REGEX = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
    
    /**
     * 数字正则表达式
     */
    public static final String NUMBER_REGEX = "^-?\\d+$";
    
    /**
     * 正数正则表达式
     */
    public static final String POSITIVE_NUMBER_REGEX = "^\\d+$";
    
    /**
     * 小数正则表达式
     */
    public static final String DECIMAL_REGEX = "^-?\\d+\\.\\d+$";
    
    /**
     * 中文正则表达式
     */
    public static final String CHINESE_REGEX = "^[\\u4e00-\\u9fa5]+$";
    
    /**
     * 英文字母正则表达式
     */
    public static final String ENGLISH_REGEX = "^[A-Za-z]+$";
    
    /**
     * 英文字母和数字正则表达式
     */
    public static final String ENGLISH_NUMBER_REGEX = "^[A-Za-z0-9]+$";
    
    /**
     * IP地址正则表达式
     */
    public static final String IP_REGEX = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
    
    /**
     * URL正则表达式
     */
    public static final String URL_REGEX = "^https?://[\\w.-]+(:[0-9]+)?(/[\\w./?%&=-]*)?$";
    
    /**
     * 日期正则表达式（yyyy-MM-dd）
     */
    public static final String DATE_REGEX = "^\\d{4}-\\d{2}-\\d{2}$";
    
    /**
     * 时间正则表达式（HH:mm:ss）
     */
    public static final String TIME_REGEX = "^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$";
    
    /**
     * 日期时间正则表达式（yyyy-MM-dd HH:mm:ss）
     */
    public static final String DATE_TIME_REGEX = "^\\d{4}-\\d{2}-\\d{2} ([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$";
    
    /**
     * 校验字符串是否匹配正则表达式
     */
    public static boolean matches(String str, String regex) {
        if (str == null || regex == null) {
            return false;
        }
        return Pattern.matches(regex, str);
    }
    
    /**
     * 校验手机号格式
     */
    public static boolean isPhone(String str) {
        return matches(str, PHONE_REGEX);
    }
    
    /**
     * 校验邮箱格式
     */
    public static boolean isEmail(String str) {
        return matches(str, EMAIL_REGEX);
    }
    
    /**
     * 校验身份证号格式
     */
    public static boolean isIdCard(String str) {
        return matches(str, ID_CARD_REGEX);
    }
    
    /**
     * 校验是否为数字
     */
    public static boolean isNumber(String str) {
        return matches(str, NUMBER_REGEX);
    }
    
    /**
     * 校验是否为正数
     */
    public static boolean isPositiveNumber(String str) {
        return matches(str, POSITIVE_NUMBER_REGEX);
    }
    
    /**
     * 校验是否为小数
     */
    public static boolean isDecimal(String str) {
        return matches(str, DECIMAL_REGEX);
    }
    
    /**
     * 校验是否为中文
     */
    public static boolean isChinese(String str) {
        return matches(str, CHINESE_REGEX);
    }
    
    /**
     * 校验是否为英文字母
     */
    public static boolean isEnglish(String str) {
        return matches(str, ENGLISH_REGEX);
    }
    
    /**
     * 校验是否为英文字母和数字
     */
    public static boolean isEnglishNumber(String str) {
        return matches(str, ENGLISH_NUMBER_REGEX);
    }
    
    /**
     * 校验IP地址格式
     */
    public static boolean isIp(String str) {
        return matches(str, IP_REGEX);
    }
    
    /**
     * 校验URL格式
     */
    public static boolean isUrl(String str) {
        return matches(str, URL_REGEX);
    }
    
    /**
     * 校验日期格式（yyyy-MM-dd）
     */
    public static boolean isDate(String str) {
        return matches(str, DATE_REGEX);
    }
    
    /**
     * 校验时间格式（HH:mm:ss）
     */
    public static boolean isTime(String str) {
        return matches(str, TIME_REGEX);
    }
    
    /**
     * 校验日期时间格式（yyyy-MM-dd HH:mm:ss）
     */
    public static boolean isDateTime(String str) {
        return matches(str, DATE_TIME_REGEX);
    }
    
    /**
     * 提取匹配的内容
     */
    public static String extract(String str, String regex) {
        if (str == null || regex == null) {
            return null;
        }
        
        java.util.regex.Matcher matcher = Pattern.compile(regex).matcher(str);
        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }
    
    /**
     * 提取所有匹配的内容
     */
    public static List<String> extractAll(String str, String regex) {
        if (str == null || regex == null) {
            return new ArrayList<>();
        }
        
        List<String> results = new ArrayList<>();
        java.util.regex.Matcher matcher = Pattern.compile(regex).matcher(str);
        while (matcher.find()) {
            results.add(matcher.group());
        }
        return results;
    }
    
    /**
     * 替换匹配的内容
     */
    public static String replace(String str, String regex, String replacement) {
        if (str == null || regex == null || replacement == null) {
            return str;
        }
        return str.replaceAll(regex, replacement);
    }
    
    /**
     * 分割字符串
     */
    public static String[] split(String str, String regex) {
        if (str == null || regex == null) {
            return new String[0];
        }
        return str.split(regex);
    }
    
    /**
     * 检查是否包含匹配的内容
     */
    public static boolean contains(String str, String regex) {
        if (str == null || regex == null) {
            return false;
        }
        return Pattern.compile(regex).matcher(str).find();
    }
    
    private RegexUtils() {
        // 私有构造函数，防止实例化
    }
}